package utils

import (
	"go-ws-server/config"
	"time"
)

// Set 设置字符串键值对，带过期时间（秒）
func Set(key string, value interface{}, expiration time.Duration) error {
	rdb := config.GetRedis()
	ctx := config.GetRedisCtx()
	return rdb.Set(ctx, key, value, expiration).Err()
}

// Get 获取字符串键的值
func Get(key string) (string, error) {
	rdb := config.GetRedis()
	ctx := config.GetRedisCtx()
	return rdb.Get(ctx, key).Result()
}

// Del 删除一个或多个 key
func Del(keys ...string) error {
	rdb := config.GetRedis()
	ctx := config.GetRedisCtx()
	return rdb.Del(ctx, keys...).Err()
}

// Exists 判断 key 是否存在
func Exists(key string) (bool, error) {
	rdb := config.GetRedis()
	ctx := config.GetRedisCtx()
	n, err := rdb.Exists(ctx, key).Result()
	return n > 0, err
}

// Expire 设置过期时间
func Expire(key string, expiration time.Duration) error {
	rdb := config.GetRedis()
	ctx := config.GetRedisCtx()
	return rdb.Expire(ctx, key, expiration).Err()
}

// ======================= Hash 操作 ========================

// HSet 设置 Hash 字段
func HSet(key string, values map[string]interface{}) error {
	rdb := config.GetRedis()
	ctx := config.GetRedisCtx()
	return rdb.HSet(ctx, key, values).Err()
}

// HGet 获取 Hash 单个字段
func HGet(key, field string) (string, error) {
	rdb := config.GetRedis()
	ctx := config.GetRedisCtx()
	return rdb.HGet(ctx, key, field).Result()
}

// HGetAll 获取 Hash 所有字段
func HGetAll(key string) (map[string]string, error) {
	rdb := config.GetRedis()
	ctx := config.GetRedisCtx()
	return rdb.HGetAll(ctx, key).Result()
}

// HDel 删除 Hash 字段
func HDel(key string, fields ...string) error {
	rdb := config.GetRedis()
	ctx := config.GetRedisCtx()
	return rdb.HDel(ctx, key, fields...).Err()
}

// ======================= List 操作 ========================

// RPush 向列表右侧添加元素
func RPush(key string, values ...interface{}) error {
	rdb := config.GetRedis()
	ctx := config.GetRedisCtx()
	return rdb.RPush(ctx, key, values...).Err()
}

// LRange 获取列表元素范围
func LRange(key string, start, stop int64) ([]string, error) {
	rdb := config.GetRedis()
	ctx := config.GetRedisCtx()
	return rdb.LRange(ctx, key, start, stop).Result()
}

// LPop 弹出左侧第一个元素
func LPop(key string) (string, error) {
	rdb := config.GetRedis()
	ctx := config.GetRedisCtx()
	return rdb.LPop(ctx, key).Result()
}

// LLen 获取列表长度
func LLen(key string) (int64, error) {
	rdb := config.GetRedis()
	ctx := config.GetRedisCtx()
	return rdb.LLen(ctx, key).Result()
}

// ======================= Key 通用操作 ========================

// Keys 获取所有匹配的 key（慎用：线上不建议大范围 Scan）
func Keys(pattern string) ([]string, error) {
	rdb := config.GetRedis()
	ctx := config.GetRedisCtx()
	return rdb.Keys(ctx, pattern).Result()
}

// Set 集合相关操作
func SAdd(key string, members ...interface{}) error {
	rdb := config.GetRedis()
	ctx := config.GetRedisCtx()
	return rdb.SAdd(ctx, key, members...).Err()
}

func SRem(key string, members ...interface{}) error {
	rdb := config.GetRedis()
	ctx := config.GetRedisCtx()
	return rdb.SRem(ctx, key, members...).Err()
}

func SIsMember(key string, member interface{}) (bool, error) {
	rdb := config.GetRedis()
	ctx := config.GetRedisCtx()
	return rdb.SIsMember(ctx, key, member).Result()
}
